﻿using System;
using System.Data;
using System.Configuration;
using System.Linq;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Xml.Linq;
using TES.EnteRegulador;
using System.Collections.ObjectModel;
using System.Collections.Generic;

namespace TES.WEB.EnteRegulador
{
    //public class MergeEnlaceDS
    //{
    //}


    public class MergeRedDS : ICloneable
    {
        private MergeEnlace _mergeEnlaceAgregado;

        public MergeEnlace MergeEnlace
        {
            get { return _mergeEnlaceAgregado; }
        }

        private MergeRed _mergeRedAgregado;

        public MergeRed MergeRed
        {
            get { return _mergeRedAgregado; }
        }

        private List<MergeEnlace> _listaMergesEnlaces;

        public ReadOnlyCollection<MergeEnlace> ListaMergesEnlaces
        {
            get { return _listaMergesEnlaces.AsReadOnly(); }
        }

        private bool? _seleccionado;

        public bool? Seleccionado
        {
            get { return _seleccionado; }
            set
            {
                // No se permite asignar null, solo es null cuando no se puede cambiar la propiedad
                if (value == null) _seleccionado = !_seleccionado;
                else _seleccionado = value;
            }
        }

        public string NombreEnlace
        {
            get
            {
                return _mergeEnlaceAgregado.CopiaAgregada.Estacion1 + " - " +
                     _mergeEnlaceAgregado.CopiaAgregada.Estacion2;
            }
        }


        public string EstaImplementado
        { get { return _mergeEnlaceAgregado.EstaImplementado; } }


        public bool TieneVersionMinisterio
        {
            get
            {
                return _mergeEnlaceAgregado.Estado == EstadoEnlace.Actualizado ||
                     _mergeEnlaceAgregado.Estado == EstadoEnlace.Eliminado ||
                     _mergeEnlaceAgregado.Estado == EstadoEnlace.Modificado;
            }
        }


        public MergeRedDS(MergeRed mergeRed, bool seleccionado)
        {
            _listaMergesEnlaces = new List<MergeEnlace>(mergeRed.ListaMerges);
            _mergeRedAgregado = mergeRed;
            List<TesGestion.Formas.Ministerio.EstadoLegalizacionEnlace> estados =
                 new List<EstadoLegalizacionEnlace>();
            foreach (MergeEnlace m in _listaMergesEnlaces)
            {
                if (!estados.Contains(m.EstadoLegalizacionEnlace))
                    estados.Add(m.EstadoLegalizacionEnlace);
            }

            if (estados.Count > 1)
            {
                Console.WriteLine("-------------Mas de un estado-----------------");
                foreach (MergeEnlace m in _listaMergesEnlaces)
                {
                    if (m.CopiaAgregada != null)
                        Console.WriteLine("- COPIA" + m.CopiaAgregada.Estacion1 + " - " + m.CopiaAgregada.Estacion2 +
                              "- ESTADO LEGALIZACION " + m.EstadoLegalizacionEnlace.ToString());

                    if (m.EnlaceMinisterio != null)
                        Console.WriteLine("- MINISTERIO" + m.EnlaceMinisterio.Estacion1 + " - " + m.EnlaceMinisterio.Estacion2);

                    if (m.CambioEnlace != null)
                    {
                        string idRed = m.CambioEnlace.CopiaGuidRed.HasValue ?
                             m.CambioEnlace.CopiaGuidRed.Value.ToString() : Guid.Empty.ToString();

                        Console.WriteLine("- CAMBIO " + m.CambioEnlace.Estacion1 + " - " + m.CambioEnlace.Estacion2 +
                             "- COPIAGUIDRED " + idRed +
                             "- IDENLACE " + m.CambioEnlace.CopiaGuidEnlace +
                             "- NUMERORED " + m.CambioEnlace.NumeroRed.ToString() +
                             "- ESTADO " + m.Estado.ToString() +
                             "- ESTADO LEGALIZACION " + m.EstadoLegalizacionEnlace.ToString() +
                             "- Regional " + m.CambioEnlace.NombreCodigoExpedienteLegalizacion);
                    }
                }
            }

            _mergeEnlaceAgregado = GetMergeEnlaceAgregado();//_listaMergesEnlaces[0];
            if (!PermitirSeleccionar) _seleccionado = (bool?)null;
            else _seleccionado = seleccionado;
            CrearListaMergesBindingControles(mergeRed.ListaMerges);
        }


        /// <summary>
        /// Este metodo se encaga de validar que a partir de la lista de enlaces que pueda tener una red, no existan 
        /// redes con más de un numero de red.
        /// </summary>
        private void AssertionNumerosRed()
        {
            List<int> numerosRed = new List<int>();
            foreach (MergeEnlace mergeActual in _listaMergesEnlaces)
            {
                if (mergeActual.EnlaceMinisterio != null && !numerosRed.Contains(mergeActual.EnlaceMinisterio.NumeroRed))
                {
                    numerosRed.Add(mergeActual.EnlaceMinisterio.NumeroRed);
                }
            }
            if (numerosRed.Count > 1)
            {
                string texto = string.Empty;
                foreach (int num in numerosRed)
                {
                    texto += " " + num.ToString();
                }
                Console.WriteLine(texto);
            }
        }


        /// <summary>
        /// Se encarga de obtener un unico enlace de la red, que se mostrará como red principal, 
        /// si la red tiene mas de dos radios se busca el que tenga numero de red, si ninguno tiene
        /// se devuelve el primer ítem. Por defecto es el primer ítem de la lista
        /// </summary>
        /// <returns></returns>
        private MergeEnlace GetMergeEnlaceAgregado()
        {
            AssertionNumerosRed();
            MergeEnlace mergePrincipalRed = _listaMergesEnlaces[0];
            if (mergePrincipalRed.EnlaceMinisterio == null)
            {
                foreach (MergeEnlace mergeActual in _listaMergesEnlaces)
                {
                    if (mergeActual.EnlaceMinisterio != null)
                    {
                        return mergeActual;
                    }
                }
            }
            return mergePrincipalRed;
        }

        private BindingList<MergeRadioVisual> _listaEnlazadaMergeRadios;

        public BindingList<MergeRadioVisual> ListaEnlazadaMergeRadios
        {
            get { return _listaEnlazadaMergeRadios; }
        }

        private BindingList<MergeAntenaVisual> _listaEnlazadaMergeAntenas1;

        public BindingList<MergeAntenaVisual> ListaEnlazadaMergeAntenas1
        {
            get { return _listaEnlazadaMergeAntenas1; }
        }


        private BindingList<MergeAntenaVisual> _listaEnlazadaMergeAntenas2;

        public BindingList<MergeAntenaVisual> ListaEnlazadaMergeAntenas2
        {
            get { return _listaEnlazadaMergeAntenas2; }
        }


        private void CrearListaMergesBindingControles(ReadOnlyCollection<MergeEnlace> merges)
        {
            _listaEnlazadaMergeAntenas1 = new BindingList<MergeAntenaVisual>();
            _listaEnlazadaMergeAntenas2 = new BindingList<MergeAntenaVisual>();
            _listaEnlazadaMergeRadios = new BindingList<MergeRadioVisual>();

            foreach (CopiaAntena copia in ListaGrupoAntenas1)
            {
                _listaEnlazadaMergeAntenas1.Add(new MergeAntenaVisual(merges[0], false, copia, true));
            }

            foreach (CopiaAntena copia in ListaGrupoAntenas2)
            {
                _listaEnlazadaMergeAntenas2.Add(new MergeAntenaVisual(merges[0], false, copia, true));
            }

            foreach (MergeEnlace mergeEnlace in merges)
            {
                _listaEnlazadaMergeRadios.Add(new MergeRadioVisual(mergeEnlace, false));
            }
        }

        public void CambiarTipoCopia(MergeEnlace.TipoCopia tipoCopia)
        {
            _mergeRedAgregado.CambiarTipoCopia(tipoCopia);

        }

        #region Propiedades agregadas


        public string Estado { get { return _mergeRedAgregado.Estado.ToString(); } }

        public EstadoLegalizacionEnlace EstadoLegalizacionEnlace
        {
            get { return _mergeEnlaceAgregado.EstadoLegalizacionEnlace; }
        }

        public string DescEstadoLegalizacionEnlace
        {
            get { return _mergeEnlaceAgregado.EstadoLegalizacionEnlace.ToString(); }
        }

        public Guid Id { get { return _mergeEnlaceAgregado.CopiaAgregada.Id; } }

        public string Direccion1 { get { return _mergeEnlaceAgregado.CopiaAgregada.Direccion1; } }

        public string Direccion2 { get { return _mergeEnlaceAgregado.CopiaAgregada.Direccion2; } }

        public string MunicipioEstacion1 { get { return _mergeEnlaceAgregado.CopiaAgregada.MunicipioEstacion1; } }

        public string MunicipioEstacion2 { get { return _mergeEnlaceAgregado.CopiaAgregada.MunicipioEstacion2; } }

        public string DepartamentoEstacion1 { get { return _mergeEnlaceAgregado.CopiaAgregada.DepartamentoEstacion1; } }

        public string DepartamentoEstacion2 { get { return _mergeEnlaceAgregado.CopiaAgregada.DepartamentoEstacion2; } }

        public string Banda { get { return _mergeEnlaceAgregado.CopiaAgregada.Banda; } }

        public string TipoModulacion { get { return _mergeEnlaceAgregado.CopiaAgregada.TipoModulacion; } }

        public string Estacion1 { get { return _mergeEnlaceAgregado.CopiaAgregada.Estacion1; } }

        public string Estacion2 { get { return _mergeEnlaceAgregado.CopiaAgregada.Estacion2; } }

        public string DescripcionCapacidad
        {
            get
            {
                return ConversionesEsquemasSenalizacion.StringCuartos2EUnos(
                     _mergeEnlaceAgregado.CopiaAgregada.CapacidadEnlaceCuartosSlot);
            }
        }

        public double? AnchoDeBandaEnlace { get { return _mergeEnlaceAgregado.CopiaAgregada.AnchoDeBandaEnlace; } }

        public double XEstacion1 { get { return _mergeEnlaceAgregado.CopiaAgregada.XEstacion1; } }

        public double XEstacion2 { get { return _mergeEnlaceAgregado.CopiaAgregada.XEstacion2; } }

        public double YEstacion1 { get { return _mergeEnlaceAgregado.CopiaAgregada.YEstacion1; } }

        public double YEstacion2 { get { return _mergeEnlaceAgregado.CopiaAgregada.YEstacion2; } }

        public double ZEstacion1 { get { return _mergeEnlaceAgregado.CopiaAgregada.ZEstacion1; } }

        public double ZEstacion2 { get { return _mergeEnlaceAgregado.CopiaAgregada.ZEstacion2; } }

        public int CodigoSistemaPoscEstacion1 { get { return _mergeEnlaceAgregado.CopiaAgregada.CodigoSistemaPoscEstacion1; } }

        public int CodigoSistemaPoscEstacion2 { get { return _mergeEnlaceAgregado.CopiaAgregada.CodigoSistemaPoscEstacion2; } }

        public string NombreCodigoExpediente
        {
            get
            {
                if (_mergeEnlaceAgregado.EnlaceMinisterio != null)
                {
                    return _mergeEnlaceAgregado.EnlaceMinisterio.NombreCodigoExpediente;
                }
                else if (_mergeEnlaceAgregado.CambioEnlace != null)
                {
                    return _mergeEnlaceAgregado.CambioEnlace.NombreCodigoExpedienteLegalizacion;
                }
                else
                {
                    return null;
                }
            }
        }

        public string CodigoExpediente
        {
            get
            {
                if (_mergeEnlaceAgregado.EnlaceMinisterio != null)
                {
                    return _mergeEnlaceAgregado.EnlaceMinisterio.CodigoExpediente;
                }
                else if (_mergeEnlaceAgregado.CambioEnlace != null)
                {
                    return _mergeEnlaceAgregado.CambioEnlace.CodigoExpedienteLegalizacion;
                }
                else
                {
                    return null;
                }
            }
        }

        public int? NumeroRed
        {
            get
            {
                if (_mergeEnlaceAgregado.EnlaceMinisterio != null)
                {
                    return _mergeEnlaceAgregado.EnlaceMinisterio.NumeroRed;
                }
                else if (_mergeEnlaceAgregado.CambioEnlace != null)
                {
                    return _mergeEnlaceAgregado.CambioEnlace.NumeroRed;
                }
                else
                {
                    return null;
                }
            }
        }

        //public BindingList<CopiaDiversidad> ListaDiversidades { get { return new BindingList<CopiaDiversidad>(_mergeEnlaceAgregado.ListaDiversidades); } }

        public BindingList<MergeDiversidad> ListaFrecuenciasDiversidadRed1 { get { return new BindingList<MergeDiversidad>(_mergeRedAgregado.MergeFrecuenciasRadio1); } }
        public BindingList<MergeDiversidad> ListaFrecuenciasDiversidadRed2 { get { return new BindingList<MergeDiversidad>(_mergeRedAgregado.MergeFrecuenciasRadio2); } }

        public Color ColorDiversidadesFrecuencia
        {
            get
            {
                return ColoresMergeVisual.CalcularColorCajaTexto(_mergeEnlaceAgregado.DiversidadFrecuenciasValido &&
                      _mergeEnlaceAgregado.CorrespondenciaDiversidadValido,
                     _mergeEnlaceAgregado.DiferenciasFotoVsMinisterio.CambioDiversidadesFrecuenciaRadio);
            }
        }


        public Color ColorDireccion1
        {
            get
            {
                return ColoresMergeVisual.CalcularColorCajaTexto(_mergeEnlaceAgregado.Direccion1Valido,
                     _mergeEnlaceAgregado.DiferenciasFotoVsMinisterio.CambioDireccion1);
            }
        }

        public Color ColorDireccion2
        {
            get
            {
                return ColoresMergeVisual.CalcularColorCajaTexto(_mergeEnlaceAgregado.Direccion2Valido,
                     _mergeEnlaceAgregado.DiferenciasFotoVsMinisterio.CambioDireccion2);
            }
        }

        public Color ColorIdBanda
        {
            get
            {
                return ColoresMergeVisual.CalcularColorCajaTexto(_mergeEnlaceAgregado.IdBandaValido &&
                     (_mergeEnlaceAgregado.CorrespondenciaDiversidadValido ||
                     _mergeEnlaceAgregado.CorrespondenciaDiversidadValido),
                     _mergeEnlaceAgregado.DiferenciasFotoVsMinisterio.CambioIdBanda);
            }
        }

        public Color ColorIdTipoModulacionEnlace
        {
            get
            {
                return ColoresMergeVisual.CalcularColorCajaTexto(_mergeEnlaceAgregado.IdTipoModulacionEnlaceValido,
                     _mergeEnlaceAgregado.DiferenciasFotoVsMinisterio.CambioIdTipoModulacionEnlace);
            }
        }

        public Color ColorAnchoDeBandaEnlace
        {
            get
            {
                return ColoresMergeVisual.CalcularColorCajaTexto(_mergeEnlaceAgregado.AnchoDeBandaEnlaceValido,
                     _mergeEnlaceAgregado.DiferenciasFotoVsMinisterio.CambioAnchoDeBandaEnlace);
            }
        }

        public Color ColorCapacidad
        {
            get
            {
                return ColoresMergeVisual.CalcularColorCajaTexto(_mergeEnlaceAgregado.CapacidadEnlaceCuartosSlotValido,
                     _mergeEnlaceAgregado.DiferenciasFotoVsMinisterio.CambioCapacidadEnlaceCuartosSlot);
            }
        }

        public Color ColorMunicipioEstacion1
        {
            get
            {
                return ColoresMergeVisual.CalcularColorCajaTexto(_mergeEnlaceAgregado.MunicipioEstacion1Valido);
            }
        }

        public Color ColorMunicipioEstacion2
        {
            get
            {
                return ColoresMergeVisual.CalcularColorCajaTexto(_mergeEnlaceAgregado.MunicipioEstacion2Valido);
            }
        }

        public Color ColorDepartamentoEstacion1
        {
            get
            {
                return ColoresMergeVisual.CalcularColorCajaTexto(_mergeEnlaceAgregado.DepartamentoEstacion1Valido);
            }
        }

        public Color ColorDepartamentoEstacion2
        {
            get
            {
                return ColoresMergeVisual.CalcularColorCajaTexto(_mergeEnlaceAgregado.DepartamentoEstacion2Valido);
            }
        }

        public Color ColorCoordenadaEstacion1
        {
            get
            {
                return ColoresMergeVisual.CalcularColorCajaTexto(_mergeEnlaceAgregado.CoordenadaEstacion1Valida);
            }
        }

        public Color ColorCoordenadaEstacion2
        {
            get
            {
                return ColoresMergeVisual.CalcularColorCajaTexto(_mergeEnlaceAgregado.CoordenadaEstacion2Valida);
            }
        }

        #endregion Propiedades agregadas

        /// <summary>
        /// Indica si este item se puede seleccionar o no dependiendo de su estado
        /// </summary>
        public bool PermitirSeleccionar
        {
            get
            {
                foreach (MergeEnlace merge in _listaMergesEnlaces)
                {
                    if (!merge.TieneDatosValidos())
                    {
                        return false;
                    }
                    if (merge.EstadoLegalizacionEnlace == EstadoLegalizacionEnlace.Creada ||
                        merge.EstadoLegalizacionEnlace == EstadoLegalizacionEnlace.Radicada)
                    {
                        return false;
                    }
                }
                bool actualizado = true;
                foreach (MergeEnlace merge in _listaMergesEnlaces)
                {
                    actualizado &= merge.Estado == EstadoEnlace.Actualizado;
                }
                if (actualizado) return false;
                return true;
            }
        }


        public string DatosCompletos
        {
            get { return _mergeRedAgregado.TieneDatosValidos() ? Resources.SI : Resources.NO; }
        }

        /// <summary>
        /// Indica el color con el que se debe mostrar esta fila cuando NO está seleccionada
        /// </summary>
        public Color BackColorFila
        {
            get
            {
                return ColoresMergeVisual.GetColorFila(ColoresMergeVisual.ColoresBackColor, _mergeEnlaceAgregado.EstadoLegalizacionEnlace,
                _mergeRedAgregado.TieneDatosValidos(), _mergeRedAgregado.Estado);
            }
        }

        /// <summary>
        /// Indica el color con el que se debe mostrar esta fila cuando está seleccionada
        /// </summary>
        public Color SelectionBackColorFila
        {
            get
            {
                return ColoresMergeVisual.GetColorFila(ColoresMergeVisual.ColoresSelectionBackColor, _mergeEnlaceAgregado.EstadoLegalizacionEnlace,
          _mergeRedAgregado.TieneDatosValidos(), _mergeRedAgregado.Estado);
            }
        }



        public BindingList<CopiaAntena> ListaGrupoAntenas1 { get { return new BindingList<CopiaAntena>(_mergeRedAgregado.ListaGrupoAntenas1); } }

        public BindingList<CopiaAntena> ListaGrupoAntenas2 { get { return new BindingList<CopiaAntena>(_mergeRedAgregado.ListaGrupoAntenas2); } }







        #region ICloneable Members

        public object Clone()
        {
            return new MergeRedDS((MergeRed)_mergeRedAgregado.Clone(), false);
        }

        #endregion
    }
}



	



